home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 39 / Amiga Format CD39 (1999-04-13)(Future Publishing)(GB)[!][issue 1999-05].iso / -seriously_amiga- / cd-rom / cdlib / cdlib.c < prev    next >
C/C++ Source or Header  |  1999-03-02  |  5KB  |  199 lines

  1. /*++
  2.  
  3. File: cdlib.c
  4.  
  5.     Read the AsimCDFS CDDA library.
  6.  
  7. --*/
  8.  
  9.  
  10. #include <stdio.h>
  11.  
  12.  
  13. typedef int BOOL;
  14. #define FALSE   0
  15. #define TRUE    1
  16.  
  17. char *pcIdxF = "AsimCDFS_Buffer:CD_Library.index";
  18. char *pcDatF = "AsimCDFS_Buffer:CD_Library.data";
  19. FILE *fIdx, *fDat;
  20.  
  21.  
  22.  
  23. /*++
  24.  
  25. Function: Help()
  26.  
  27.     Print command line usage.
  28.  
  29. --*/
  30.  
  31. void Help()
  32.     {
  33.     fprintf( stderr, "CdLib: list the AsimCDFS audio disc library\n" );
  34.     fprintf( stderr, "Usage:\n  CdLib [options] >listfile\n" );
  35.     fprintf( stderr, "where options are\n" );
  36.     fprintf( stderr, "  -d    list discs\n" );
  37.     fprintf( stderr, "  -t    list tracks\n" );
  38.     fprintf( stderr, "  -v/-V verbose track listing\n" );
  39.     fprintf( stderr, "  -u    show user settings\n" );
  40.     }
  41.  
  42.  
  43.  
  44. /*++
  45.  
  46. Function: DiscInfo()
  47.  
  48.     Print information about one CD in the database.
  49.  
  50. Arguments:
  51.  
  52.     nRecord - record number, zero-based
  53.  
  54.     nFlags - option bitmap: 1=discs, 2=tracks, 4=user settings
  55.  
  56.     nLevel - level of track listing verbosity: 1=add artist, 2=add album
  57.  
  58. Return Value:
  59.  
  60.     FALSE, if no such record exists.
  61.  
  62. --*/
  63.  
  64. BOOL DiscInfo( long lRecord, int nFlags, int nLevel )
  65.     {
  66.     long lOffset;
  67.     int i;
  68.     char caName[ 50 ], caTitle[ 50 ], caTrack[ 50 ];
  69.     unsigned char cMode, cTrks, cMin, cSec, cFlags, cPos;
  70.  
  71.     if( fseek( fIdx, 4 * lRecord, SEEK_SET ) != 0 )
  72.         return FALSE;
  73.     if( fread( &lOffset, sizeof( long ), 1, fIdx ) < 1 )
  74.         return FALSE;
  75.     fseek( fDat, lOffset, SEEK_SET );
  76.     fread( caName, sizeof( char ), 41, fDat );
  77.     fread( caTitle, sizeof( char ), 34, fDat );
  78.     cFlags = fgetc( fDat );
  79.     cTrks = fgetc( fDat );
  80.     cMin  = fgetc( fDat );
  81.     cSec  = fgetc( fDat );
  82.     fseek( fDat, 10, SEEK_CUR );
  83.     cMode = fgetc( fDat );
  84.     if( nFlags & 1 )
  85.         {
  86.         if( nFlags & 4 )
  87.             {
  88.             if( cFlags & 1 )
  89.                 printf( "A%c/%c%c ", " PRO"[ cMode ],
  90.                         (cFlags & 2) ? 'S':'s', (cFlags & 4) ? 'R':'r' );
  91.             else
  92.                 printf( "      " );
  93.             }
  94.         printf( "%2d:%02d ", cMin, cSec );
  95.         printf( "%-30s %-30s ", caTitle, caName );
  96.         printf( "%2d", cTrks );
  97.         putchar( '\n' );
  98.         }
  99.     if( nFlags & 2 )
  100.         {
  101.         fseek( fDat, 34, SEEK_CUR );
  102.         for( i = 0; i < cTrks; i++ )
  103.             {
  104.             fread( caTrack, sizeof( char ), 30, fDat );
  105.             cMin  = fgetc( fDat );
  106.             cSec  = fgetc( fDat );
  107.             fseek( fDat, 5, SEEK_CUR );
  108.             cPos   = fgetc( fDat );
  109.             cFlags = fgetc( fDat );
  110.             fseek( fDat, 15, SEEK_CUR );
  111.             if( nFlags & 4 )
  112.                 {
  113.                 printf( ( cPos <= cTrks ) ? "%3d" : "   ", cPos );
  114.                 printf( " %c ", (cFlags & 1) ? 'x':' ' );
  115.                 }
  116.             printf( "%2d:%02d ", cMin, cSec );
  117.             printf( "%-30s ", caTrack );
  118.             if( nLevel > 0 )
  119.                 printf( "%-30s %s", caName, (nLevel > 1) ? caTitle : "" );
  120.             putchar( '\n' );
  121.             }
  122.         }
  123.  
  124.     return TRUE;
  125.     }
  126.  
  127.  
  128.  
  129. /*++
  130.  
  131. Function: main()
  132.  
  133.     Uses unix style command line parsing, see Help() for explanation
  134.     of the expected parameters.
  135.  
  136. --*/
  137.  
  138. int main( int argc, char *argv[] )
  139.     {
  140.     long lDiscs, lIdx;
  141.     int nFlags = 0, nLevel = 0;
  142.  
  143.     while( --argc )
  144.         {
  145.         argv++;
  146.         if( *argv[ 0 ] == '-' )
  147.             switch( argv[ 0 ][ 1 ] )
  148.                 {
  149.                 case 'd':
  150.                     nFlags |= 1;
  151.                     break;
  152.                 case 't':
  153.                     nFlags |= 2;
  154.                     break;
  155.                 case 'u':
  156.                     nFlags |= 4;
  157.                     break;
  158.                 case 'v':
  159.                     nLevel = 1;
  160.                     break;
  161.                 case 'V':
  162.                     nLevel = 2;
  163.                     break;
  164.                 default:
  165.                     Help();
  166.                     return 5;
  167.                 }
  168.         else
  169.             {
  170.             Help();
  171.             return 5;
  172.             }
  173.         }
  174.  
  175.     fIdx = fopen( pcIdxF, "rb" );
  176.     if( fIdx == NULL )
  177.         {
  178.         fprintf( stderr, "file not found: \"%s\"\n", pcIdxF );
  179.         return 10;
  180.         }
  181.     fDat = fopen( pcDatF, "rb" );
  182.     if( fDat == NULL )
  183.         {
  184.         fprintf( stderr, "file not found: \"%s\"\n", pcDatF );
  185.         return 10;
  186.         }
  187.     fseek( fIdx, 0, SEEK_END );
  188.     lDiscs = ftell( fIdx ) / 4;
  189.     printf( "%ld audio CDs listed\n", lDiscs );
  190.     if( nFlags > 0 )
  191.         for( lIdx = 0; lIdx < lDiscs; lIdx++ )
  192.             DiscInfo( lIdx, nFlags, nLevel );
  193.  
  194.     fclose( fIdx );
  195.     fclose( fDat );
  196.  
  197.     return 0;
  198.     }
  199.